在 Go 語言開發中,資料庫操作是每個開發者都無法繞開的話題。而 GORM 作為一款功能強大、設計優雅的 ORM 庫,憑藉其簡潔的 API 和豐富的功能,成為了 Go 開發者的首選工具。無論你是新手還是老手,掌握 GORM 的 API 都能讓你的開發效率提升數倍!
今天,我們將深入探討 GORM 的所有核心 API,帶你從入門到精通,徹底掌握 GORM 的奧秘!
為什麼選擇 GORM?#
GORM 不僅僅是一個 ORM 工具,它更像是一個資料庫操作的瑞士軍刀。以下是 GORM 的核心優勢:
- 簡潔的 API 設計:鏈式調用,代碼清晰易讀。
- 強大的功能支持:支持 CRUD、事務、鉤子、預加載等高級功能。
- 多資料庫支持:MySQL、PostgreSQL、SQLite、SQL Server 等主流資料庫。
- 活躍的社區:豐富的文檔和社區支持,問題解決速度快。
接下來,我們將從 初始化、模型定義、CRUD 操作、高級功能 四個方面,全面解析 GORM 的 API!
1. 初始化與配置#
1.1 連接資料庫#
GORM 支持多種資料庫,以下是連接 MySQL 的示例:
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
fmt.Println("Database connected!")
}
1.2 配置 GORM#
GORM 提供了豐富的配置選項,例如日誌級別、表前綴等:
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info), // 設置日誌級別
NamingStrategy: schema.NamingStrategy{
TablePrefix: "t_", // 表前綴
},
})
2. 模型定義#
2.1 定義模型#
GORM 使用構造體來定義模型,每個字段可以通過標籤(Tag)指定資料庫約束:
type User struct {
gorm.Model // 內嵌 gorm.Model,包含 ID、CreatedAt、UpdatedAt、DeletedAt
Name string `gorm:"type:varchar(100);not null"`
Age int `gorm:"default:18"`
Email string `gorm:"uniqueIndex"`
}
2.2 自動遷移#
GORM 可以根據模型自動創建或更新表結構:
db.AutoMigrate(&User{}) // 自動創建 users 表
3. CRUD 操作#
3.1 創建記錄#
// 創建單條記錄
user := User{Name: "John", Age: 20}
result := db.Create(&user) // 返回 *gorm.DB
fmt.Println(user.ID) // 獲取插入的主鍵
// 批量創建
users := []User{{Name: "Alice"}, {Name: "Bob"}}
db.Create(&users)
3.2 查詢記錄#
// 查詢單條記錄
var user User
db.First(&user, 1) // 根據主鍵查詢
db.First(&user, "name = ?", "John") // 條件查詢
// 查詢多條記錄
var users []User
db.Find(&users) // 查詢所有記錄
db.Where("age > ?", 18).Find(&users) // 條件查詢
// 查詢特定字段
db.Select("name", "age").Find(&users)
// 排序和分頁
db.Order("age desc").Limit(10).Offset(0).Find(&users)
3.3 更新記錄#
// 更新單條記錄
db.Model(&user).Update("Age", 21)
// 更新多個字段
db.Model(&user).Updates(User{Name: "Alice", Age: 22})
// 批量更新
db.Model(&User{}).Where("age < ?", 18).Update("age", 20)
3.4 刪除記錄#
// 刪除單條記錄
db.Delete(&user)
// 根據主鍵刪除
db.Delete(&User{}, 1)
// 批量刪除
db.Where("age < ?", 18).Delete(&User{})
4. 高級功能#
4.1 事務處理#
GORM 支持手動和自動事務:
// 手動事務
tx := db.Begin()
if err := tx.Create(&User{Name: "John"}).Error; err != nil {
tx.Rollback()
return
}
tx.Commit()
// 自動事務
db.Transaction(func(tx *gorm.DB) error {
if err := tx.Create(&User{Name: "John"}).Error; err != nil {
return err
}
return nil
})
4.2 鉤子函數#
GORM 提供了模型生命週期鉤子,可以在特定時間點執行自定義邏輯:
func (u *User) BeforeCreate(tx *gorm.DB) error {
u.CreatedAt = time.Now()
return nil
}
func (u *User) AfterDelete(tx *gorm.DB) error {
fmt.Println("User deleted:", u.ID)
return nil
}
4.3 預加載(解決 N+1 查詢問題)#
type Order struct {
gorm.Model
UserID uint
User User
}
var orders []Order
db.Preload("User").Find(&orders) // 預加載關聯的 User 資料
4.4 原生 SQL#
GORM 支持執行原生 SQL 語句:
var users []User
db.Raw("SELECT * FROM users WHERE age > ?", 18).Scan(&users)
db.Exec("UPDATE users SET age = ? WHERE name = ?", 20, "John")
5. 關聯關係#
5.1 一對一#
type Profile struct {
gorm.Model
UserID uint
User User
}
type User struct {
gorm.Model
Profile Profile
}
5.2 一對多#
type Order struct {
gorm.Model
UserID uint
User User
}
type User struct {
gorm.Model
Orders []Order
}
5.3 多對多#
type User struct {
gorm.Model
Languages []Language `gorm:"many2many:user_languages;"`
}
type Language struct {
gorm.Model
Name string
Users []User `gorm:"many2many:user_languages;"`
}
6. 其他功能#
6.1 軟刪除#
GORM 支持軟刪除,記錄不會被真正刪除,而是設置 DeletedAt 字段:
db.Delete(&user) // 軟刪除
db.Unscoped().Delete(&user) // 硬刪除
6.2 自定義表名#
func (User) TableName() string {
return "custom_users"
}
總結#
GORM 的 API 設計簡潔而強大,覆蓋了資料庫操作的方方面面。無論是簡單的 CRUD 操作,還是複雜的關聯查詢和事務處理,GORM 都能輕鬆應對。通過熟練掌握這些 API,你可以大幅提升開發效率,寫出更優雅、更高效的 Go 代碼。
如果你對某個功能有更深入的需求,可以參考 GORM 官方文檔 獲取更多詳細信息。希望這篇指南能幫助你徹底掌握 GORM,成為資料庫操作的終極高手!
立即嘗試 GORM,讓你的 Go 語言開發飛起來! 🚀
歡迎關注我的公眾號 “全棧開發 ck”,原創技術文章第一時間推送。